"""
热力图(heat map)
热力图（或者色块图），由小色块组成的二维图表，其中：

x、y轴可以是分类变量，对应的小方块由连续数值表示颜色强度
即用两个分类字段确定数值点的位置，用于展示数据的分布情况
"""
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

sns.set()
sns.set_style('whitegrid', {'font.sans-serif': ['simhei', 'Arial']})

# 实例1：模拟绘制北京景区热度图
df = pd.DataFrame(
    np.random.rand(4, 7),
    index=["天安门", "故宫", "奥林匹克森林公园", "八达岭长城"],
    columns=["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
)

plt.figure(figsize=(10, 6))
heatmap = sns.heatmap(df, annot=True, fmt=".2f", linewidths=.5, cmap="YlGnBu")
heatmap.get_figure().savefig("./Files/my_heatmap.png", format="png")

# 实例2：绘制泰坦尼克事件与存亡变量的关系
df = pd.concat(
    [
        pd.read_csv("./Files/titanic/titanic_train.csv"),
        pd.read_csv("./Files/titanic/titanic_test.csv"),
    ]
)
# print(df.head())

# pands把字符串类型的列，变成分类数字编码
for field in ["Sex", "Cabin", "Embarked"]:
    df[field] = df[field].astype("category").cat.codes

# print(df.head())

# 计算不同变量之间两两相关系数
df.drop(['Name', "Ticket"], axis=1, inplace=True)
df.corr()
print(df.head())

plt.figure(figsize=(10, 6))
heatmap2 = sns.heatmap(df.corr(), annot=True, fmt=".2f", linewidths=.5, cmap="YlGnBu")
heatmap2.get_figure().savefig("./Files/my_heatmap2.png", format="png")
